Lab 3 - Behavioural VHDL -- Part 2

 

Цел

 

Придобиване на практически опит за разработване на поведенчески VHDL модели.

 

Задание

Да се разработят поведенчески VHDL модели на различни цифрови схеми. Да се провери корекността на моделите посредством симулация.

 

Задача 5 -- Генератор на бит за нечетност (оператор for-loop)

Да се разработи поведенчески VHDL модел на 8-битов генератор на бит за нечетност (фигура 5.1).

Фигура 5.1 -- Схема на генератор на бит за нечетност



Описанието на изводите на генератора е дадено в Таблица 1.

Таблица 5.1
Сигнал Тип Посока Функция
D STD_LOGIC_VECTOR (7 downto 0) вход Данни, за които се изчислява бит за нечетност
ODD STD_LOGIC изход Сигнал за нечетност - приема стойност '1' когато броя на единиците във входните данни D е нечетен.

На фигура 5.2 е даден VHDL модела на генератор на бит за нечетност (odd8.vhd). Разгледайте дадения модел и се уверете, че разбирате смисъла на VHDL конструкциите в него.

Фигура 5.2 -- Поведенчески модел на генератор на бит за нечетност


library ieee;
use ieee.std_logic_1164.all;

entity oddParityLoop is
  
  port (D: in std_logic_vector (7 downto 0);
        ODD : out std_logic ) ;
end oddParityLoop ; 

architecture arch1 of oddParityLoop is
begin

  process (D) 
    variable tmp: std_logic;
  begin
    tmp := '0';

    for i in 0 to 7 loop
        tmp := tmp xor D( i ) ;
    end loop ;

    ODD <= tmp;

  end process;

end arch1 ;

Да се разработи подходяща тестова установка и да се симулира модела.

 

Задача 6 -- Параметризиран модел на генератор на бит за нечетност (оператор for-loop)

Да се разработи параметризиран вариант на модела от задача 5. Разрядността на входната шина D да се задава посредством параметър N.

 

Указание

 

Пример за използването на generic параметри може да се види в Lab 2 -- Part 2

 

Задача 7 -- Регистров файл (оператор for-loop)

Регистровия файл представлява набор от регистри, в които се съхраняват данни. Да се разработи поведенчески VHDL модел на регистров файл състоящ се от четири 32-битови регистъра. Входно/изходните сигнали са дадени в Таблица 7.1.

Таблица 7.1
Сигнал Тип Посока Функция
DATA_IN STD_LOGIC_VECTOR (31 downto 0) вход Входна магистрала за данни
ADDR STD_LOGIC_VECTOR (1 downto 0) вход Адрес за избор на регистър от регистровия файл
WRITE STD_LOGIC вход При WRITE='1' е разрешен записа в избрания регистър.
CLK STD_LOGIC вход Тактов сигнал. По неговия нарастващ фронт се синхронизира записа в регистровия файл.
RST STD_LOGIC вход Асинхронно нулиране при ниско ниво.
DATA_OUT STD_LOGIC_VECTOR (31 downto 0) изход Изходна магистрала за данни.

На фигура 7.1 е даден VHDL модела на регистровия файл (regfile.vhd). Разгледайте дадения модел и се уверете, че разбирате смисъла на VHDL конструкциите в него. Обърнете внимание на използването на оператор for-loop за нулиране на регистрите.

Фигура 7.1 -- Поведенчески модел на регистров файл


library IEEE;
use IEEE.std_logic_1164.all;

entity regFile is port (
  CLK, RST: in std_logic;
  DATA_IN: in std_logic_vector(31 downto 0);
  ADDR: in std_logic_vector(1 downto 0);
  WRITE: in std_logic;
  DATA_OUT: out std_logic_vector(31 downto 0)
  );
end regFile;

architecture behavioral of regFile is

subtype reg is std_logic_vector(31 downto 0);
type regArray is array (integer range <>) of reg;

signal registerFile: regArray(0 to 3);

begin

  regProc: process (CLK, RST) 

  begin

    if RST = '1' then
      for i in registerFile'range loop
        registerFile(i) <= (others => '0');
      end loop;

    elsif CLK'event and CLK = '1' then
      if (WRITE = '1') then
        case ADDR is
          when "00" =>
            registerFile(0) <= DATA_IN;
          when "01" =>
            registerFile(1) <= DATA_IN;
          when "10" =>
            registerFile(2) <= DATA_IN;
          when "11" =>
            registerFile(3) <= DATA_IN;
          when others =>
            null;
        end case;
      end if;
    end if;
  end process;

  outputs: process(ADDR, registerFile) begin
    case ADDR is
      when "00" =>
        DATA_OUT <= registerFile(0);
      when "01" =>
        DATA_OUT <= registerFile(1);
      when "10" =>
        DATA_OUT <= registerFile(2);
      when "11" =>
        DATA_OUT <= registerFile(3);
      when others =>
        null;
    end case;
  end process;

end behavioral;
 

Да се разработи подходяща тестова установка и да се симулира модела.

 

Задача 8 -- Регистров файл -- Вариант с двупосочна шина за данни

Да се разработи модифициран вариант на модела от задача 7 като данните се записват/четат от регистровия файл посредством двупосочна шина DATA. Избор на режим четене/запис се определя от сигнала RW (виж таблица 8.1).

Таблица 8.1
Сигнал Тип Посока Функция
DATA STD_LOGIC_VECTOR (31 downto 0) вход/изход Входно/изходна шина за данни
ADDR STD_LOGIC_VECTOR (1 downto 0) вход Адрес за избор на регистър от регистровия файл
RW STD_LOGIC вход Определя режим на работа:
RW='1' -- четене, RW='0' -- запис.
CLK STD_LOGIC вход Тактов сигнал. По неговия нарастващ фронт се синхронизира записа в регистровия файл.
RST STD_LOGIC вход Асинхронно нулиране при ниско ниво.

 

 

Указания

 

 

  1. Използвайте посока inout при описанието на сигнала DATA.
  2. За да се избегнат конфликти в шината DATA изходите на регистровия файл трябва да бъдат с три състояния. За целта използвайте следната VHDL конструкция:
outputs: process(RW, ADDR, registerFile) 
begin
    if(RW = '1') then
      case ADDR is
        when "00" =>
          DATA <= registerFile(0);
        when "01" =>
          DATA <= registerFile(1);
        when "10" =>
          DATA <= registerFile(2);
        when "11" =>
          DATA <= registerFile(3);
        when others =>
          null;
       end case;
    else
      DATA <= (others =>'Z');
    end if;
  end process;